package com.yc;

import org.apache.log4j.Logger;

import java.io.IOException;
import java.io.OutputStream;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test3_Server {
    private static Logger log = Logger.getLogger(Test3_Server.class.getName());

    public static void main(String[] args) throws IOException {
        //方案1：直接指定一个端口
        //方案2：循环10000以上的端口，试一个空闲的端口
        //方案3：将端口配置在一个.xml.properties的文件
        final  int port =10000;
        ServerSocket ss=null;
        for (int i=10000;i<65535;i++) {
            try {
                //完成一台时间服务器，选择合适的端口工作
                ss = new ServerSocket(i);
                break;
            } catch (IOException e) {
                if (e instanceof BindException) {
                    //用错误日志 记录 端口被占用的信息
                    log.error("端口："+i+"已经被占用");
                }
            }
        }
        //用info 级别记录， ServerSocket套接字创建成功的信息
        log.info(ss.getInetAddress().getHostAddress()+"启动了，监听了端口号：***"+ss.getLocalPort()+"....");
         DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Date d= null;
        String time = dateFormat.format(new Date());

        while(true){
            log.info("服务器ServerSocket准备等待客户端的联接");
            Socket s =ss.accept();//阻塞式的方法
            log.info("理解阻塞的意思，获取了"+s.getRemoteSocketAddress()+"的联接");
            //TODO: 服务器中的业务
            d=new Date();
            //套接字编程的底层就是io
            try (OutputStream oos =s.getOutputStream();){
                oos.write(time.getBytes());
            } catch (Exception e) {
                e.printStackTrace();
            }
            s.close();
            log.info("服务端开与服务端的联接");
        }
    }
}
